🎖️GitЯра🎖️
Node / meshtastic / Meshtastic-Android / files / core / model / src / commonTest / kotlin / org / meshtastic / core / model / LoRaRegionPresetsTest.kt
Displaying Raw • Download
core/model/src/commonTest/kotlin/org/meshtastic/core/model/LoRaRegionPresetsTest.kt bd2863243bab6eb213401d949839a2bc74dde7e2 (bd286324) Text, 9.95 KB
T8b949e/*
* Copyright (c) 2026 Meshtastic LLC
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
Tff7b72package T7ee787org.meshtastic.core.model
Tff7b72import T7ee787org.meshtastic.proto.Config.LoRaConfig.ModemPreset
Tff7b72import T7ee787org.meshtastic.proto.Config.LoRaConfig.RegionCode
Tff7b72import T7ee787org.meshtastic.proto.LoRaPresetGroup
Tff7b72import T7ee787org.meshtastic.proto.LoRaRegionPresetMap
Tff7b72import T7ee787org.meshtastic.proto.LoRaRegionPresets
Tff7b72import T7ee787kotlin.test.Test
Tff7b72import T7ee787kotlin.test.assertEquals
Tff7b72import T7ee787kotlin.test.assertFalse
Tff7b72import T7ee787kotlin.test.assertNull
Tff7b72import T7ee787kotlin.test.assertTrue
Tff7b72class T56d364LoRaRegionPresetsTest Tb4b4b4{
T8b949e// group 0: standard US presets (unlicensed). group 1: a licensed-only region.
Tff7b72private Tff7b72val Te6edf3map Tff7b72=
Te6edf3LoRaRegionPresetMapTb4b4b4(
Te6edf3groups Tff7b72=
Te6edf3listOfTb4b4b4(
Te6edf3LoRaPresetGroupTb4b4b4(
Te6edf3presets Tff7b72= Te6edf3listOfTb4b4b4(Te6edf3ModemPresetTb4b4b4.Te6edf3LONG_FASTTb4b4b4, Te6edf3ModemPresetTb4b4b4.Te6edf3LONG_SLOWTb4b4b4, Te6edf3ModemPresetTb4b4b4.Te6edf3SHORT_FASTTb4b4b4)Tb4b4b4,
Te6edf3default_preset Tff7b72= Te6edf3ModemPresetTb4b4b4.Te6edf3LONG_FASTTb4b4b4,
Te6edf3licensed_only Tff7b72= Tff7b72falseTb4b4b4,
Tb4b4b4)Tb4b4b4,
Te6edf3LoRaPresetGroupTb4b4b4(
Te6edf3presets Tff7b72= Te6edf3listOfTb4b4b4(Te6edf3ModemPresetTb4b4b4.Te6edf3TINY_FASTTb4b4b4, Te6edf3ModemPresetTb4b4b4.Te6edf3TINY_SLOWTb4b4b4)Tb4b4b4,
Te6edf3default_preset Tff7b72= Te6edf3ModemPresetTb4b4b4.Te6edf3TINY_FASTTb4b4b4,
Te6edf3licensed_only Tff7b72= Tff7b72trueTb4b4b4,
Tb4b4b4)Tb4b4b4,
T8b949e// group 2: models EU_N_868's superset advertising - LONG_FAST is legal but not the default.
Te6edf3LoRaPresetGroupTb4b4b4(
Te6edf3presets Tff7b72= Te6edf3listOfTb4b4b4(Te6edf3ModemPresetTb4b4b4.Te6edf3LONG_FASTTb4b4b4, Te6edf3ModemPresetTb4b4b4.Te6edf3MEDIUM_FASTTb4b4b4)Tb4b4b4,
Te6edf3default_preset Tff7b72= Te6edf3ModemPresetTb4b4b4.Te6edf3MEDIUM_FASTTb4b4b4,
Te6edf3licensed_only Tff7b72= Tff7b72falseTb4b4b4,
Tb4b4b4)Tb4b4b4,
Tb4b4b4)Tb4b4b4,
Te6edf3region_groups Tff7b72=
Te6edf3listOfTb4b4b4(
Te6edf3LoRaRegionPresetsTb4b4b4(Te6edf3region Tff7b72= Te6edf3RegionCodeTb4b4b4.Te6edf3USTb4b4b4, Te6edf3group_index Tff7b72= T79c0ff0Tb4b4b4)Tb4b4b4,
Te6edf3LoRaRegionPresetsTb4b4b4(Te6edf3region Tff7b72= Te6edf3RegionCodeTb4b4b4.Te6edf3UA_433Tb4b4b4, Te6edf3group_index Tff7b72= T79c0ff1Tb4b4b4)Tb4b4b4,
Te6edf3LoRaRegionPresetsTb4b4b4(Te6edf3region Tff7b72= Te6edf3RegionCodeTb4b4b4.Te6edf3EU_N_868Tb4b4b4, Te6edf3group_index Tff7b72= T79c0ff2Tb4b4b4)Tb4b4b4,
Tb4b4b4)Tb4b4b4,
Tb4b4b4)
Tf0883e@Test
Tff7b72fun Td2a8ff`null map imposes no constraint`Tb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72val Te6edf3mapTb4b4b4: Te6edf3LoRaRegionPresetMap? Tff7b72= Tff7b72null
Te6edf3assertNullTb4b4b4(Te6edf3mapTb4b4b4.Te6edf3constraintForTb4b4b4(Te6edf3RegionCodeTb4b4b4.Te6edf3USTb4b4b4)Tb4b4b4)
T8b949e// repair leaves the current preset untouched when unconstrained
Te6edf3assertEqualsTb4b4b4(Te6edf3ModemPresetTb4b4b4.Te6edf3LONG_FASTTb4b4b4, Te6edf3mapTb4b4b4.Te6edf3repairPresetForTb4b4b4(Te6edf3RegionCodeTb4b4b4.Te6edf3USTb4b4b4, Te6edf3ModemPresetTb4b4b4.Te6edf3LONG_FASTTb4b4b4)Tb4b4b4)
Tb4b4b4}
Tf0883e@Test
Tff7b72fun Td2a8ff`region absent from region_groups is unconstrained`Tb4b4b4(Tb4b4b4) Tb4b4b4{
Te6edf3assertNullTb4b4b4(Te6edf3mapTb4b4b4.Te6edf3constraintForTb4b4b4(Te6edf3RegionCodeTb4b4b4.Te6edf3JPTb4b4b4)Tb4b4b4)
Te6edf3assertEqualsTb4b4b4(Te6edf3ModemPresetTb4b4b4.Te6edf3SHORT_TURBOTb4b4b4, Te6edf3mapTb4b4b4.Te6edf3repairPresetForTb4b4b4(Te6edf3RegionCodeTb4b4b4.Te6edf3JPTb4b4b4, Te6edf3ModemPresetTb4b4b4.Te6edf3SHORT_TURBOTb4b4b4)Tb4b4b4)
Tb4b4b4}
Tf0883e@Test
Tff7b72fun Td2a8ff`out of range group_index is treated as unconstrained`Tb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72val Te6edf3broken Tff7b72=
Te6edf3LoRaRegionPresetMapTb4b4b4(
Te6edf3groups Tff7b72= Te6edf3emptyListTb4b4b4(Tb4b4b4)Tb4b4b4,
Te6edf3region_groups Tff7b72= Te6edf3listOfTb4b4b4(Te6edf3LoRaRegionPresetsTb4b4b4(Te6edf3region Tff7b72= Te6edf3RegionCodeTb4b4b4.Te6edf3USTb4b4b4, Te6edf3group_index Tff7b72= T79c0ff5Tb4b4b4)Tb4b4b4)Tb4b4b4,
Tb4b4b4)
Te6edf3assertNullTb4b4b4(Te6edf3brokenTb4b4b4.Te6edf3constraintForTb4b4b4(Te6edf3RegionCodeTb4b4b4.Te6edf3USTb4b4b4)Tb4b4b4)
Tb4b4b4}
Tf0883e@Test
Tff7b72fun Td2a8ff`a group with no presets is treated as unconstrained`Tb4b4b4(Tb4b4b4) Tb4b4b4{
T8b949e// A degenerate/malformed group must degrade to the full preset list, not an empty picker.
Tff7b72val Te6edf3empty Tff7b72=
Te6edf3LoRaRegionPresetMapTb4b4b4(
Te6edf3groups Tff7b72= Te6edf3listOfTb4b4b4(Te6edf3LoRaPresetGroupTb4b4b4(Te6edf3presets Tff7b72= Te6edf3emptyListTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3licensed_only Tff7b72= Tff7b72falseTb4b4b4)Tb4b4b4)Tb4b4b4,
Te6edf3region_groups Tff7b72= Te6edf3listOfTb4b4b4(Te6edf3LoRaRegionPresetsTb4b4b4(Te6edf3region Tff7b72= Te6edf3RegionCodeTb4b4b4.Te6edf3USTb4b4b4, Te6edf3group_index Tff7b72= T79c0ff0Tb4b4b4)Tb4b4b4)Tb4b4b4,
Tb4b4b4)
Te6edf3assertNullTb4b4b4(Te6edf3emptyTb4b4b4.Te6edf3constraintForTb4b4b4(Te6edf3RegionCodeTb4b4b4.Te6edf3USTb4b4b4)Tb4b4b4)
Te6edf3assertEqualsTb4b4b4(Te6edf3ModemPresetTb4b4b4.Te6edf3LONG_FASTTb4b4b4, Te6edf3emptyTb4b4b4.Te6edf3repairPresetForTb4b4b4(Te6edf3RegionCodeTb4b4b4.Te6edf3USTb4b4b4, Te6edf3ModemPresetTb4b4b4.Te6edf3LONG_FASTTb4b4b4)Tb4b4b4)
Tb4b4b4}
Tf0883e@Test
Tff7b72fun Td2a8ff`constraint resolves the region's preset group`Tb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72val Te6edf3constraint Tff7b72= Te6edf3mapTb4b4b4.Te6edf3constraintForTb4b4b4(Te6edf3RegionCodeTb4b4b4.Te6edf3USTb4b4b4)
Te6edf3assertEqualsTb4b4b4(Te6edf3listOfTb4b4b4(Te6edf3ModemPresetTb4b4b4.Te6edf3LONG_FASTTb4b4b4, Te6edf3ModemPresetTb4b4b4.Te6edf3LONG_SLOWTb4b4b4, Te6edf3ModemPresetTb4b4b4.Te6edf3SHORT_FASTTb4b4b4)Tb4b4b4, Te6edf3constraintTff7b72?.Te6edf3presetsTb4b4b4)
Te6edf3assertEqualsTb4b4b4(Te6edf3ModemPresetTb4b4b4.Te6edf3LONG_FASTTb4b4b4, Te6edf3constraintTff7b72?.Te6edf3defaultPresetTb4b4b4)
Te6edf3assertFalseTb4b4b4(Te6edf3constraintTff7b72?.Te6edf3licensedOnly Tff7b72=Tff7b72= Tff7b72trueTb4b4b4)
Tb4b4b4}
Tf0883e@Test
Tff7b72fun Td2a8ff`unlicensed group is never gated`Tb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72val Te6edf3constraint Tff7b72= Te6edf3mapTb4b4b4.Te6edf3constraintForTb4b4b4(Te6edf3RegionCodeTb4b4b4.Te6edf3USTb4b4b4)Tff7b72!!
Te6edf3assertFalseTb4b4b4(Te6edf3constraintTb4b4b4.Te6edf3isGatedTb4b4b4(Te6edf3isLicensed Tff7b72= Tff7b72falseTb4b4b4)Tb4b4b4)
Te6edf3assertFalseTb4b4b4(Te6edf3constraintTb4b4b4.Te6edf3isGatedTb4b4b4(Te6edf3isLicensed Tff7b72= Tff7b72trueTb4b4b4)Tb4b4b4)
Tb4b4b4}
Tf0883e@Test
Tff7b72fun Td2a8ff`licensed_only group is gated only for an unlicensed operator`Tb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72val Te6edf3constraint Tff7b72= Te6edf3mapTb4b4b4.Te6edf3constraintForTb4b4b4(Te6edf3RegionCodeTb4b4b4.Te6edf3UA_433Tb4b4b4)Tff7b72!!
Te6edf3assertTrueTb4b4b4(Te6edf3constraintTb4b4b4.Te6edf3licensedOnlyTb4b4b4)
Te6edf3assertTrueTb4b4b4(Te6edf3constraintTb4b4b4.Te6edf3isGatedTb4b4b4(Te6edf3isLicensed Tff7b72= Tff7b72falseTb4b4b4)Tb4b4b4)
Te6edf3assertFalseTb4b4b4(Te6edf3constraintTb4b4b4.Te6edf3isGatedTb4b4b4(Te6edf3isLicensed Tff7b72= Tff7b72trueTb4b4b4)Tb4b4b4)
Tb4b4b4}
Tf0883e@Test
Tff7b72fun Td2a8ff`repair keeps a preset that is legal in the region`Tb4b4b4(Tb4b4b4) Tb4b4b4{
Te6edf3assertEqualsTb4b4b4(Te6edf3ModemPresetTb4b4b4.Te6edf3SHORT_FASTTb4b4b4, Te6edf3mapTb4b4b4.Te6edf3repairPresetForTb4b4b4(Te6edf3RegionCodeTb4b4b4.Te6edf3USTb4b4b4, Te6edf3ModemPresetTb4b4b4.Te6edf3SHORT_FASTTb4b4b4)Tb4b4b4)
Tb4b4b4}
Tf0883e@Test
Tff7b72fun Td2a8ff`repair swaps an illegal preset to the region default`Tb4b4b4(Tb4b4b4) Tb4b4b4{
T8b949e// SHORT_TURBO is not in the US group, so it should snap to the group's default (LONG_FAST).
Te6edf3assertEqualsTb4b4b4(Te6edf3ModemPresetTb4b4b4.Te6edf3LONG_FASTTb4b4b4, Te6edf3mapTb4b4b4.Te6edf3repairPresetForTb4b4b4(Te6edf3RegionCodeTb4b4b4.Te6edf3USTb4b4b4, Te6edf3ModemPresetTb4b4b4.Te6edf3SHORT_TURBOTb4b4b4)Tb4b4b4)
Tb4b4b4}
T8b949e// A malformed map whose advertised default is not in its own legal set.
Tff7b72private Tff7b72val Te6edf3oddMap Tff7b72=
Te6edf3LoRaRegionPresetMapTb4b4b4(
Te6edf3groups Tff7b72=
Te6edf3listOfTb4b4b4(
Te6edf3LoRaPresetGroupTb4b4b4(
Te6edf3presets Tff7b72= Te6edf3listOfTb4b4b4(Te6edf3ModemPresetTb4b4b4.Te6edf3MEDIUM_FASTTb4b4b4, Te6edf3ModemPresetTb4b4b4.Te6edf3MEDIUM_SLOWTb4b4b4)Tb4b4b4,
Te6edf3default_preset Tff7b72= Te6edf3ModemPresetTb4b4b4.Te6edf3LONG_FASTTb4b4b4, T8b949e// not in presets
Te6edf3licensed_only Tff7b72= Tff7b72falseTb4b4b4,
Tb4b4b4)Tb4b4b4,
Tb4b4b4)Tb4b4b4,
Te6edf3region_groups Tff7b72= Te6edf3listOfTb4b4b4(Te6edf3LoRaRegionPresetsTb4b4b4(Te6edf3region Tff7b72= Te6edf3RegionCodeTb4b4b4.Te6edf3USTb4b4b4, Te6edf3group_index Tff7b72= T79c0ff0Tb4b4b4)Tb4b4b4)Tb4b4b4,
Tb4b4b4)
Tf0883e@Test
Tff7b72fun Td2a8ff`repair falls back to the first legal preset when the default is not in the group`Tb4b4b4(Tb4b4b4) Tb4b4b4{
Te6edf3assertEqualsTb4b4b4(Te6edf3ModemPresetTb4b4b4.Te6edf3MEDIUM_FASTTb4b4b4, Te6edf3oddMapTb4b4b4.Te6edf3repairPresetForTb4b4b4(Te6edf3RegionCodeTb4b4b4.Te6edf3USTb4b4b4, Te6edf3ModemPresetTb4b4b4.Te6edf3SHORT_FASTTb4b4b4)Tb4b4b4)
Tb4b4b4}
Tf0883e@Test
Tff7b72fun Td2a8ff`region default preset is LongTurbo for US and absent for other regions`Tb4b4b4(Tb4b4b4) Tb4b4b4{
Te6edf3assertEqualsTb4b4b4(Te6edf3ModemPresetTb4b4b4.Te6edf3LONG_TURBOTb4b4b4, Te6edf3defaultPresetForTb4b4b4(Te6edf3RegionCodeTb4b4b4.Te6edf3USTb4b4b4)Tb4b4b4)
Te6edf3assertNullTb4b4b4(Te6edf3defaultPresetForTb4b4b4(Te6edf3RegionCodeTb4b4b4.Te6edf3EU_868Tb4b4b4)Tb4b4b4)
Tb4b4b4}
Tf0883e@Test
Tff7b72fun Td2a8ff`region change keeps a legal preset when not fresh setup`Tb4b4b4(Tb4b4b4) Tb4b4b4{
Te6edf3assertEqualsTb4b4b4(
Te6edf3ModemPresetTb4b4b4.Te6edf3SHORT_FASTTb4b4b4,
Te6edf3mapTb4b4b4.Te6edf3presetForRegionChangeTb4b4b4(Te6edf3RegionCodeTb4b4b4.Te6edf3EU_868Tb4b4b4, Te6edf3RegionCodeTb4b4b4.Te6edf3USTb4b4b4, Te6edf3ModemPresetTb4b4b4.Te6edf3SHORT_FASTTb4b4b4)Tb4b4b4,
Tb4b4b4)
Tb4b4b4}
Tf0883e@Test
Tff7b72fun Td2a8ff`region change keeps a legal placeholder when not fresh setup`Tb4b4b4(Tb4b4b4) Tb4b4b4{
T8b949e// Default adoption is a fresh-setup rule only: an already-configured node moving regions keeps LONG_FAST.
Te6edf3assertEqualsTb4b4b4(
Te6edf3ModemPresetTb4b4b4.Te6edf3LONG_FASTTb4b4b4,
Te6edf3mapTb4b4b4.Te6edf3presetForRegionChangeTb4b4b4(Te6edf3RegionCodeTb4b4b4.Te6edf3USTb4b4b4, Te6edf3RegionCodeTb4b4b4.Te6edf3EU_N_868Tb4b4b4, Te6edf3ModemPresetTb4b4b4.Te6edf3LONG_FASTTb4b4b4)Tb4b4b4,
Tb4b4b4)
Tb4b4b4}
Tf0883e@Test
Tff7b72fun Td2a8ff`fresh setup keeps a deliberately pinned legal preset`Tb4b4b4(Tb4b4b4) Tb4b4b4{
T8b949e// UNSET + a non-placeholder preset is a deliberate pin (e.g. USERPREFS_LORACONFIG_MODEM_PRESET, #6704).
Te6edf3assertEqualsTb4b4b4(
Te6edf3ModemPresetTb4b4b4.Te6edf3SHORT_FASTTb4b4b4,
Te6edf3mapTb4b4b4.Te6edf3presetForRegionChangeTb4b4b4(Te6edf3RegionCodeTb4b4b4.Te6edf3UNSETTb4b4b4, Te6edf3RegionCodeTb4b4b4.Te6edf3USTb4b4b4, Te6edf3ModemPresetTb4b4b4.Te6edf3SHORT_FASTTb4b4b4)Tb4b4b4,
Tb4b4b4)
Tb4b4b4}
Tf0883e@Test
Tff7b72fun Td2a8ff`fresh setup placeholder adopts the region's advertised default`Tb4b4b4(Tb4b4b4) Tb4b4b4{
T8b949e// LONG_FAST is legal in the EU_N_868 group, but the placeholder still adopts the advertised default.
Te6edf3assertEqualsTb4b4b4(
Te6edf3ModemPresetTb4b4b4.Te6edf3MEDIUM_FASTTb4b4b4,
Te6edf3mapTb4b4b4.Te6edf3presetForRegionChangeTb4b4b4(Te6edf3RegionCodeTb4b4b4.Te6edf3UNSETTb4b4b4, Te6edf3RegionCodeTb4b4b4.Te6edf3EU_N_868Tb4b4b4, Te6edf3ModemPresetTb4b4b4.Te6edf3LONG_FASTTb4b4b4)Tb4b4b4,
Tb4b4b4)
Tb4b4b4}
Tf0883e@Test
Tff7b72fun Td2a8ff`fresh setup placeholder adopts the built-in default when unconstrained`Tb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72val Te6edf3nullMapTb4b4b4: Te6edf3LoRaRegionPresetMap? Tff7b72= Tff7b72null
Te6edf3assertEqualsTb4b4b4(
Te6edf3ModemPresetTb4b4b4.Te6edf3LONG_TURBOTb4b4b4,
Te6edf3nullMapTb4b4b4.Te6edf3presetForRegionChangeTb4b4b4(Te6edf3RegionCodeTb4b4b4.Te6edf3UNSETTb4b4b4, Te6edf3RegionCodeTb4b4b4.Te6edf3USTb4b4b4, Te6edf3ModemPresetTb4b4b4.Te6edf3LONG_FASTTb4b4b4)Tb4b4b4,
Tb4b4b4)
Tb4b4b4}
Tf0883e@Test
Tff7b72fun Td2a8ff`fresh setup pin that is illegal in the region is still repaired`Tb4b4b4(Tb4b4b4) Tb4b4b4{
Te6edf3assertEqualsTb4b4b4(
Te6edf3ModemPresetTb4b4b4.Te6edf3LONG_FASTTb4b4b4,
Te6edf3mapTb4b4b4.Te6edf3presetForRegionChangeTb4b4b4(Te6edf3RegionCodeTb4b4b4.Te6edf3UNSETTb4b4b4, Te6edf3RegionCodeTb4b4b4.Te6edf3USTb4b4b4, Te6edf3ModemPresetTb4b4b4.Te6edf3SHORT_TURBOTb4b4b4)Tb4b4b4,
Tb4b4b4)
Tb4b4b4}
Tf0883e@Test
Tff7b72fun Td2a8ff`fresh setup never adopts a malformed map's illegal advertised default`Tb4b4b4(Tb4b4b4) Tb4b4b4{
Te6edf3assertEqualsTb4b4b4(
Te6edf3ModemPresetTb4b4b4.Te6edf3MEDIUM_FASTTb4b4b4,
Te6edf3oddMapTb4b4b4.Te6edf3presetForRegionChangeTb4b4b4(Te6edf3RegionCodeTb4b4b4.Te6edf3UNSETTb4b4b4, Te6edf3RegionCodeTb4b4b4.Te6edf3USTb4b4b4, Te6edf3ModemPresetTb4b4b4.Te6edf3LONG_FASTTb4b4b4)Tb4b4b4,
Tb4b4b4)
Tb4b4b4}
T8b949e// A pinned build advertises its preset as UNSET's map entry (firmware #11507): the same fixture plus a
T8b949e// single-preset UNSET group, here stating a deliberate LONG_FAST pin.
Tff7b72private Tff7b72val Te6edf3pinnedMap Tff7b72=
Te6edf3mapTb4b4b4.Te6edf3copyTb4b4b4(
Te6edf3groups Tff7b72=
Te6edf3mapTb4b4b4.Te6edf3groups Tff7b72+
Te6edf3LoRaPresetGroupTb4b4b4(
Te6edf3presets Tff7b72= Te6edf3listOfTb4b4b4(Te6edf3ModemPresetTb4b4b4.Te6edf3LONG_FASTTb4b4b4)Tb4b4b4,
Te6edf3default_preset Tff7b72= Te6edf3ModemPresetTb4b4b4.Te6edf3LONG_FASTTb4b4b4,
Te6edf3licensed_only Tff7b72= Tff7b72falseTb4b4b4,
Tb4b4b4)Tb4b4b4,
Te6edf3region_groups Tff7b72= Te6edf3mapTb4b4b4.Te6edf3region_groups Tff7b72+ Te6edf3LoRaRegionPresetsTb4b4b4(Te6edf3region Tff7b72= Te6edf3RegionCodeTb4b4b4.Te6edf3UNSETTb4b4b4, Te6edf3group_index Tff7b72= T79c0ff3Tb4b4b4)Tb4b4b4,
Tb4b4b4)
Tf0883e@Test
Tff7b72fun Td2a8ff`an UNSET map entry marks even a LongFast pin as deliberate at fresh setup`Tb4b4b4(Tb4b4b4) Tb4b4b4{
T8b949e// Without the entry this placeholder would adopt EU_N_868's MEDIUM_FAST default (asserted above).
Te6edf3assertEqualsTb4b4b4(
Te6edf3ModemPresetTb4b4b4.Te6edf3LONG_FASTTb4b4b4,
Te6edf3pinnedMapTb4b4b4.Te6edf3presetForRegionChangeTb4b4b4(Te6edf3RegionCodeTb4b4b4.Te6edf3UNSETTb4b4b4, Te6edf3RegionCodeTb4b4b4.Te6edf3EU_N_868Tb4b4b4, Te6edf3ModemPresetTb4b4b4.Te6edf3LONG_FASTTb4b4b4)Tb4b4b4,
Tb4b4b4)
Tb4b4b4}
Tf0883e@Test
Tff7b72fun Td2a8ff`a pin stated via UNSET entry is still repaired when illegal in the region`Tb4b4b4(Tb4b4b4) Tb4b4b4{
Te6edf3assertEqualsTb4b4b4(
Te6edf3ModemPresetTb4b4b4.Te6edf3TINY_FASTTb4b4b4,
Te6edf3pinnedMapTb4b4b4.Te6edf3presetForRegionChangeTb4b4b4(Te6edf3RegionCodeTb4b4b4.Te6edf3UNSETTb4b4b4, Te6edf3RegionCodeTb4b4b4.Te6edf3UA_433Tb4b4b4, Te6edf3ModemPresetTb4b4b4.Te6edf3LONG_FASTTb4b4b4)Tb4b4b4,
Tb4b4b4)
Tb4b4b4}
Tb4b4b4}
Served by rngit 1.5.0 - Generated in 0.07s